package models

import (
	"encoding/json"
	"fmt"
	"gorm.io/gorm"
	"gvb-server/Request"
	"gvb-server/global"
	"gvb-server/utils"
	"os"
)

//func (Banner) TableName() string {
//	return "Banner"
//}

//有符号整数：int8（1字节）、int16（2字节）、int32（4字节）、int64（8字节）/*
//无符号整数：uint8（1字节）、uint16（2字节）、uint32（4字节）、uint64（8字节）*/
//整数: int, int64 (对应 BIGINT 类型)
//
//浮点数: float64 (对应 DOUBLE 或 FLOAT 类型)
//
//字符串: string (对应 VARCHAR, TEXT, CHAR 等类型)
//
//日期时间: time.Time (对应 DATETIME, TIMESTAMP 等类型)
//
//布尔: bool (对应 BOOLEAN 类型)
//
//二进制: []byte (对应 BLOB, BINARY 或 VARBINARY 类型)

type Banner struct {
	ID         uint      `gorm:"primaryKey" json:"id"`
	DeletedAt  int64     `json:"deleted_at"`
	CreateDate int64     `json:"create_date"`
	UpdateDate int64     `json:"-"`
	Status     int       `gorm:"default:1" json:"status"`
	Path       string    `gorm:"size:256" json:"path"` // 文章标题
	Hash       string    `json:"hash"`                 // hash 判断图片是否重复
	Name       string    `gorm:"size:30" json:"name"`
	Type       ImageType `gorm:"default:1" json:"type"`
}

type ImageType int8

const (
	ImageTypeLocal ImageType = 1
	ImageTypeQiNiu ImageType = 2
)

// MarshalJSON2 ------------------------ SignSource ------------------------
func (IT ImageType) MarshalJSON() ([]byte, error) {

	fmt.Println("查询是否被主动调用？")

	return json.Marshal(IT.String())
}

func (IT ImageType) String() string {
	fmt.Println("2222查询是否被主动调用？")
	var str string
	switch IT {
	case ImageTypeLocal:
		str = "本地"
	case ImageTypeQiNiu:
		str = "七牛云"
	default:
		str = "其他"
	}
	return str
}

// DelLocalByPath 删除后
func (b *Banner) DelLocalByPath(tx *gorm.DB) (err error) {
	if b.Type == ImageTypeLocal {
		err = os.Remove(b.Path)
		global.Log.Error(err)
		return err
	}
	return nil
}

type path struct {
	Path string `gorm:"size:256" json:"path"`
	Name string `gorm:"size:30" json:"name"`
}

func (b *Banner) DelByIds(s Request.BannerDelRequest) utils.PubStatus {
	var r utils.PubStatus

	var rm []Banner
	c := global.DB.Where("status = ? ", utils.STATUSNORMAL).Find(&rm, s.Ids).RowsAffected // 查询条数
	r.Status = utils.SUCCESS
	if c == 0 {
		r.Status = utils.ERROR
		r.Msg = "文件不存在"
		return r
	}

	// 获取需要删除的本地文件
	var p []path
	global.DB.Table("banners").Where("id IN ?,status = ? ", s.Ids, utils.STATUSNORMAL).Find(&p)
	for _, l := range p {
		fmt.Printf("需要删除的path2：%v", l.Path+"/"+l.Name)
		err := os.Remove(l.Path + "/" + l.Name)
		global.Log.Error(err)
	}

	// 删除数据库文件
	result := global.DB.Table("banners").Where("id IN ?", s.Ids).Updates(map[string]interface{}{"status": 2})

	// 删除本地数据
	r.Msg = fmt.Sprintf("共删除的%d张图片", result.RowsAffected)

	return r
}

func (b *Banner) UpdateByIds(s Request.BannerEditRequest, id string) utils.PubStatus {
	var r utils.PubStatus

	var rm []Banner
	c := global.DB.Where("status = ? ", utils.STATUSNORMAL).Find(&rm, id).RowsAffected // 查询条数
	r.Status = utils.SUCCESS
	if c == 0 {
		r.Status = utils.ERROR
		r.Msg = "文件不存在"
		return r
	}

	result := global.DB.Table("banners").Where("id = ?", id).Updates(&s)

	// 删除本地数据
	r.Msg = fmt.Sprintf("共删除的%d张图片", result.RowsAffected)

	return r
}
